home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 April: Mac OS SDK / Dev.CD Apr 99 SDK1.toast / Development Kits / AppleShare IP SDK / ASIP Registry / Sample Code / RegistryCookbook.c next >
Encoding:
C/C++ Source or Header  |  1998-07-17  |  14.3 KB  |  491 lines  |  [TEXT/CWIE]

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stddef.h> /* needed for offsetof */
  4. #include <string.h>
  5.  
  6. #include "AppleShareRegistry.h"
  7.  
  8. OAMNotificationUPP    gNotifyProc = NULL;
  9.  
  10.  
  11. void BuildObjectSpecByNameType(OAMObjectSpec *obj, StringPtr name, OAMType type);
  12. void BuildObjectSpecByShortID(OAMObjectSpec *obj, OAMShortObjectSpec id);
  13. void MyListRegistryAgents(unsigned char *  name, unsigned char * zone);
  14. OAMSessionID MyOpenLocalAgentSession();
  15. OAMStatus MyAuthenticate(OAMSessionID sess, StringPtr name, StringPtr password);
  16. OAMStatus MyGetMachineName(OAMSessionID sess, StringPtr machineName);
  17. void MyListAllUserNames(OAMSessionID sess);
  18. void MyCreateUser(OAMSessionID sess, unsigned char * name);
  19. void MyAuthenticateUser(OAMSessionID sessionID, unsigned char* userName);
  20. void MyChangeUserName(OAMSessionID sess, OAMObjectSpec *userObj, unsigned char *name);
  21. void MySetNotifyProc(OAMSessionID sessionID);
  22. void MyNotifyProc( OAMNotification *no );
  23.  
  24. void DisplayAttr(OAMAttributeDescriptor *attr);
  25. void ConcatUniqueNumString( unsigned char *name);
  26.  
  27. void BuildObjectSpecByNameType(OAMObjectSpec *obj, StringPtr name, OAMType type)
  28. {
  29.     short len = 0;
  30.     
  31.     memset(obj, 0, sizeof(OAMObjectSpec));
  32.     obj->specType = kOAMObjectSpecByNameType;
  33.     obj->objectType = type;
  34.     len = *name + 1;
  35.     memcpy(obj->u.name, name, len);
  36. }
  37.  
  38. void BuildObjectSpecByShortID(OAMObjectSpec *obj, OAMShortObjectSpec id)
  39. {
  40.     memset(obj, 0, sizeof(OAMObjectSpec));
  41.     obj->specType = kOAMObjectSpecByShortID;
  42.     obj->u.shortID = id;
  43. }
  44.  
  45.  
  46. void MyListRegistryAgents(unsigned char *  name, unsigned char * zone)
  47. {
  48.     UInt32                numInBuffer    = 0;
  49.     UInt32                numFound    = 0;
  50.     OAMStatus            err            = noErr;
  51.     char                buffer[2048];
  52.     OAMBufferDescriptor    lookup_bd;
  53.  
  54.  
  55.     OAMServerLocator*    loc            = NULL;
  56.     int                    loc_size    = offsetof(OAMServerLocator,protSpecific) + sizeof(Str32);
  57.  
  58.     OAMServerSpec        serverSpec;    
  59.     
  60.     int                    serverIndex;
  61.     
  62.     /* set up buffer descriptor */
  63.     lookup_bd.buffer    = buffer;
  64.     lookup_bd.bufferLen    = sizeof(buffer);
  65.     lookup_bd.actCount    = 0;
  66.     
  67.     /* Build AppleTalk OAMServerLocator */
  68.     loc = (OAMServerLocator *) NewPtr(loc_size);
  69.     memset(loc, 0, loc_size);
  70.     loc->specSize = loc_size;
  71.     loc->protType = kOAMLocatorAppletalk;
  72.     memcpy (loc->name, name, sizeof(Str32));            
  73.     memcpy (loc->protSpecific, zone, sizeof(Str32));    
  74.     
  75.      err = OAMFindServer(loc, &lookup_bd, &numInBuffer, &numFound, NULL);
  76.     printf("Found %d AppleShare Registry Agent(s).\n", numFound);    
  77.  
  78.     for (serverIndex = 1; serverIndex<=numInBuffer; serverIndex++)
  79.     {
  80.         err = OAMFindServerExtract(&lookup_bd, serverIndex,&serverSpec);
  81.         p2cstr(serverSpec.name);
  82.         printf("%s\n", serverSpec.name);
  83.     }
  84. }
  85. OAMSessionID MyOpenLocalAgentSession()
  86. {
  87.     OAMStatus        err = noErr;
  88.     OAMSessionID    sessID = 0;
  89.     
  90.     err = OAMOpenSession(NULL, &sessID, NULL);
  91.     
  92.     return sessID;
  93. }
  94.  
  95. OAMStatus MyAuthenticate(OAMSessionID sess, StringPtr name, StringPtr password)
  96. {    
  97.     OAMStatus        err = noErr;
  98.     OAMObjectSpec    obj;
  99.     OAMKey        key;
  100.     
  101.     memset(&key, 0, sizeof(key));
  102.     memcpy(&key.keyBuffer, password, 8);
  103.     key.keyBufferLen = 8;
  104.     BuildObjectSpecByNameType(&obj, name, kOAMUser);
  105.     err = OAMAuthenticateSession(sess, &obj, &key, NULL);
  106.  
  107.     return err;
  108. }
  109.  
  110. OAMStatus MyGetMachineName(OAMSessionID sess, StringPtr machineName)
  111. {
  112.     OAMStatus        err = noErr;
  113.     OAMObjectSpec    machineObj;    
  114.     OAMAttributeDescriptor myAttrDesc[2] = {};
  115.     
  116.     memset(&myAttrDesc, 0, sizeof(myAttrDesc));
  117.     
  118.     myAttrDesc[0].attributeSignature = kOAMMachine;
  119.     myAttrDesc[0].attributeType = kOAMServerName;
  120.     myAttrDesc[0].bufferDescriptor.buffer = machineName;
  121.     myAttrDesc[0].bufferDescriptor.bufferLen = sizeof(Str31);
  122.     myAttrDesc[0].bufferDescriptor.actCount = sizeof(Str31);
  123.     /* null terminate array of attribute descriptors */
  124.     myAttrDesc[1].attributeSignature = NULL;
  125.  
  126.     BuildObjectSpecByShortID(&machineObj, kOAMMachineShortID);    
  127.     err = OAMGetAttribute(sess, &machineObj,  myAttrDesc, NULL);
  128.  
  129.     return err;
  130. }
  131. void DisplayAttr(OAMAttributeDescriptor *attr)
  132. {
  133.     if (attr && attr->attributeSignature) {
  134.         printf("---------------------------------\n");
  135.         printf("attr->status = %d\n",attr->status );
  136.         printf("attr->offset = %d\n",attr->offset );
  137.         printf("attr->actSize = %d\n",attr->actSize );
  138.         printf("attr->bufferDescriptor.bufferLen = %d\n",attr->bufferDescriptor.bufferLen );
  139.         printf("attr->bufferDescriptor.actCount = %d\n",attr->bufferDescriptor.actCount );
  140.         if (attr->status == 0)
  141.         {
  142.         switch (attr->attributeSignature) {
  143.             case kOAMBasic:
  144.                 switch (attr->attributeType) {
  145.                         case kOAMName:
  146.                         {
  147.                              StringPtr name = (StringPtr)attr->bufferDescriptor.buffer;
  148.                             p2cstr(name);
  149.                             printf("Name = %s",name);
  150.                         }
  151.                         break;
  152.                         case kOAMInternetName:
  153.                         {
  154.                             StringPtr name = (StringPtr)attr->bufferDescriptor.buffer;
  155.                             p2cstr(name);
  156.                             printf("Name = %s",name);
  157.                         }
  158.                         break;
  159.                         case kOAMShortID:
  160.                             printf("ID = %d",*((UInt32*)attr->bufferDescriptor.buffer));
  161.                         break;    
  162.                         case kOAMType:
  163.                             printf("Type = %.4s",(char*)attr->bufferDescriptor.buffer);
  164.                         break;    
  165.                 };
  166.             break;
  167.             case kOAMUser:
  168.                 switch (attr->attributeType) {
  169.                         case kOAMUserFlags:
  170.                             printf("userFlags = 0x%x",*((UInt16*)attr->bufferDescriptor.buffer));
  171.                         break;    
  172.                         case kOAMUserComment:
  173.                         {
  174.                             printf("comment = %#s",(StringPtr)attr->bufferDescriptor.buffer);
  175.                         }
  176.                         break;
  177.                         case kOAMPasswordLen:
  178.                             printf("pwdLen = %d",*((UInt8*)attr->bufferDescriptor.buffer));
  179.                         break;
  180.                         case kOAMLastLogin:
  181.                         {
  182.                             DateTimeRec    date = {};
  183.                             SecondsToDate(*(UInt32*)attr->bufferDescriptor.buffer, &date);
  184.                             printf("kLastLogin: %d/%d/%d", date.month, date.day, date.year);
  185.                         }
  186.                         break;
  187.                 };
  188.                 
  189.             break;
  190.             
  191.             case kOAMService:
  192.                 switch (attr->attributeType) {
  193.                         case kOAMShortStatus:
  194.                             printf("shortStatus = 0x%x",*((UInt32*)attr->bufferDescriptor.buffer));
  195.                         break;
  196.                         /*
  197.                         case kOAMDetailedStatus:
  198.                             printf("detailedStatus = 0x%x",*((UInt32*)attr->bufferDescriptor.buffer));
  199.                         break;    
  200.                         */
  201.                         case kOAMServiceFlags:
  202.                             printf("kServiceFlags = 0x%x",*((UInt32*)attr->bufferDescriptor.buffer));
  203.                         break;    
  204.                 };
  205.             break;
  206.             
  207.             case kOAMMachine:
  208.                 switch (attr->attributeType) {
  209.                         case kOAMGuestProgramLinking:
  210.                             printf("kGuestProgramLinking = 0x%x",*((UInt8*)attr->bufferDescriptor.buffer));
  211.                         break;    
  212.                         case kOAMNoGuestAccess:
  213.                             printf("kNoGuestAccess = 0x%x",*((UInt8*)attr->bufferDescriptor.buffer));
  214.                         break;    
  215.                         case kOAMProgramLinking:
  216.                             printf("kProgramLinking = 0x%x",*((UInt8*)attr->bufferDescriptor.buffer));
  217.                         break;    
  218.                         case kOAMServerName:
  219.                             printf("name = %#s",(StringPtr)attr->bufferDescriptor.buffer);
  220.                         break;    
  221.                         case kOAMMultihoming:
  222.                             printf("kMultihoming = 0x%x",*((UInt8*)attr->bufferDescriptor.buffer));
  223.                         break;    
  224.                         case kOAMNoSavePassword:
  225.                             printf("kNoSavePassword = 0x%x",*((UInt8*)attr->bufferDescriptor.buffer));
  226.                         break;    
  227.                         case kOAMMinPasswordLen:
  228.                             printf("kMinPasswordLen = 0x%x",*((UInt8*)attr->bufferDescriptor.buffer));
  229.                         break;    
  230.                         case kOAMMaxBadLogins:
  231.                             printf("kMaxBadLogins = %d",*((UInt16*)attr->bufferDescriptor.buffer));
  232.                         break;    
  233.                         case kOAMDefaultShutdown:
  234.                             printf("kDefaultShutdown = %d",*((UInt16*)attr->bufferDescriptor.buffer));
  235.                         break;    
  236.                         case kOAMUniqueID:
  237.                             printf("kUniqueID = %d",*((UInt32*)attr->bufferDescriptor.buffer));                        
  238.                         break;
  239.                 };
  240.             break;
  241.  
  242.             case kOAMGestalt:
  243.                 printf("selector: %.4s response: %X", (char*)&attr->attributeType, *((SInt32*)attr->bufferDescriptor.buffer));
  244.             break;            
  245.             
  246.  
  247.         }    
  248.         printf(" <status, len> = <%d, %d> ",attr->status,attr->bufferDescriptor.actCount );
  249.         printf("\n---------------------------------\n");
  250.         
  251.         }
  252.     
  253.     }
  254. }
  255. void MyListAllUserNames(OAMSessionID sess)
  256. {    
  257.     OAMStatus            err = noErr;
  258.     OAMIterationSpec    iter;
  259.     UInt32                maxToGet    = 15;
  260.     OAMType                typeList[2] = {kOAMUser,0};
  261.     char                bd_buffer[4096] = {};
  262.     char                iter_buffer[512] = {};
  263.     OAMBufferDescriptor    bd    = {};
  264.     OAMAttributeDescriptor iter_attr[2] = {};
  265.     Str31                userName = {};
  266.     int                 userCount = 0;
  267.     
  268.     /* set up buffer descriptor */
  269.     bd.buffer    = bd_buffer;
  270.     bd.bufferLen = sizeof(bd_buffer);
  271.     bd.actCount    = 0;
  272.     
  273.     /* set up iter spec */
  274.     memset(&iter, 0 , sizeof(iter));
  275.     iter.iterationType = kOAMIterObjects;
  276.     iter.typeList    = typeList;
  277.     iter.iterationFlags = kOAMIterByIndex;
  278.     iter.u.startingIndex = 1;
  279.     iter.maxToGet = maxToGet;
  280.  
  281.     /* set up iter_attr */
  282.     iter_attr[0].attributeSignature = kOAMBasic;
  283.     iter_attr[0].attributeType = kOAMName;
  284.     iter_attr[0].bufferDescriptor.buffer = userName;
  285.     iter_attr[0].bufferDescriptor.bufferLen = sizeof(iter_buffer);
  286.     iter_attr[0].bufferDescriptor.actCount = 0;
  287.     /* null terminate array of attribute descriptors */
  288.     iter_attr[1].attributeSignature = NULL;
  289.     
  290.     do
  291.     {
  292.         err = OAMIterate(sess, &iter, iter_attr, &bd, NULL);
  293.         
  294.         if(!err) {
  295.             OAMObjectSpec obj = {};
  296.             OAMParseInfo parseInfo;
  297.             int            attrIndex;
  298.             
  299.             memset(&parseInfo, 0, sizeof(OAMParseInfo));
  300.             err = OAMParseAttributeBuffer(&bd, iter_attr, &parseInfo);            
  301.  
  302.         
  303.             while(OAMParseGetNextObject(&parseInfo, &obj) != kOAMParseDone) {
  304.                 printf("id = %d type = %s\n", obj.u.shortID, (char*)&obj.objectType);
  305.                 for ( attrIndex = 0; ; attrIndex++)
  306.                 {
  307.                     if (OAMParseGetNextAttribute(&parseInfo, &iter_attr[attrIndex]) != kOAMParseDone)
  308.                         DisplayAttr(&iter_attr[attrIndex]);
  309.                     else
  310.                         break;
  311.                 }
  312.                 userCount++;
  313.             }
  314.             iter.u.startingIndex += maxToGet;
  315.         }
  316.     } while (!err && iter.more );
  317.     printf("userCount(%d)\n",userCount);
  318. }
  319.  
  320. void MyCreateUser(OAMSessionID sessionID, unsigned char *name)
  321. {
  322.     OAMStatus        err = noErr;
  323.     OAMObjectSpec    userObj;    
  324.     OAMAttributeDescriptor myAttrDesc[3] = {};
  325.     char            password[8] = "temp\0\0\0\0"; /* Zero Padded 8 byte key */
  326.     UInt16            userFlags = kOAMLoginEnabledMask | kOAMGetNewPwdMask;
  327.     
  328.     printf("userFlags(0x%X)\n",userFlags);
  329.     memset(&myAttrDesc, 0, sizeof(myAttrDesc));
  330.     /* password attribute */
  331.     myAttrDesc[0].attributeSignature = kOAMUser;
  332.     myAttrDesc[0].attributeType = kOAMPasswordAttribute;
  333.     myAttrDesc[0].bufferDescriptor.buffer = password;
  334.     myAttrDesc[0].bufferDescriptor.bufferLen = 8;
  335.     myAttrDesc[0].bufferDescriptor.actCount = 0;
  336.     /* user flags attribute */
  337.     myAttrDesc[1].attributeSignature = kOAMUser;
  338.     myAttrDesc[1].attributeType = kOAMUserFlags;
  339.     myAttrDesc[1].bufferDescriptor.buffer = &userFlags;
  340.     myAttrDesc[1].bufferDescriptor.bufferLen = sizeof(userFlags);
  341.     myAttrDesc[1].bufferDescriptor.actCount = 0;
  342.     /* null terminate array of attribute descriptors */
  343.     myAttrDesc[2].attributeSignature = NULL;
  344.  
  345.     printf("CreateUser(%#s)\n", name);
  346.     BuildObjectSpecByNameType(&userObj,(StringPtr) name, kOAMUser);
  347.     err = OAMCreateObject(sessionID, &userObj, NULL, NULL);
  348.  
  349. }
  350.  
  351. void MyAuthenticateUser(OAMSessionID sessionID, unsigned char* userName)
  352. {
  353.     OAMStatus            err            = noErr;
  354.     OAMAuthenticateInfo    auth        = {};
  355.     OAMObjectSpec        userObj        = {};
  356.     OAMBufferDescriptor    input        = {};
  357.     OAMBufferDescriptor output        = {};
  358.     char    output_buffer[16]        = {};
  359.     char    password[8]                = "temp\0\0\0\0"; /* Zero Padded 8 byte key */
  360.     
  361.     /* set up user object */
  362.     BuildObjectSpecByNameType(&userObj,(StringPtr) userName, kOAMUser);
  363.     
  364.     /* set up authInfo */
  365.     auth.objectSpec = &userObj;
  366.     auth.flags = 0;
  367.     auth.stage = kOAMAuthLogin;
  368.     memcpy(auth.uam,"Cleartxt Passwrd",sizeof("Cleartxt Passwrd"));
  369.  
  370.     /* set up input buffer */
  371.     input.buffer = &password;
  372.     input.bufferLen = 8;
  373.     input.actCount = 8;
  374.  
  375.     /* set up output buffer */
  376.     output.buffer = &output_buffer;
  377.     output.bufferLen = 16;
  378.  
  379.     err = OAMAuthenticateObject(sessionID, &auth, &input, &output, NULL);
  380.     
  381.     printf("OAMAuthenticateObject err:%d\n", err);
  382.     printf("authInfo->objStatus(%d)\n",    auth.objStatus);
  383.  
  384. }
  385.  
  386. void ConcatUniqueNumString( unsigned char *name)
  387. {
  388.     unsigned long secs;
  389.     Str255    datestr;
  390.     
  391.     GetDateTime(&secs);
  392.     NumToString(secs, datestr);
  393.     p2cstr(datestr);
  394.     p2cstr((unsigned char *)name);
  395.     
  396.     strcat((char*) name, (const char *)datestr); /* userXXXXX */
  397.     
  398.     c2pstr((char*)name);
  399.  
  400. }
  401. void MyChangeUserName(OAMSessionID sess, OAMObjectSpec *userObj, unsigned char *name)
  402. {
  403.     OAMStatus        err = noErr;
  404.     OAMAttributeDescriptor myAttrDesc[2] = {};
  405.     
  406.     memset(&myAttrDesc, 0, sizeof(myAttrDesc));
  407.     
  408.     myAttrDesc[0].attributeSignature = kOAMBasic;
  409.     myAttrDesc[0].attributeType = kOAMName;
  410.     myAttrDesc[0].bufferDescriptor.buffer = name;
  411.     myAttrDesc[0].bufferDescriptor.bufferLen = sizeof(Str31);
  412.     myAttrDesc[0].bufferDescriptor.actCount = 0;
  413.     /* null terminate array of attribute descriptors */
  414.     myAttrDesc[1].attributeSignature = NULL;
  415.  
  416.     err = OAMSetAttribute(sess, userObj,  myAttrDesc, NULL);
  417. }
  418. void MyNotifyProc( OAMNotification *no )
  419. {    
  420.     printf("vers %d sess %X objectID %d notifyID %d userData %X type %X \n",
  421.             no->version, no->sess, no->objectID, no->notifyID, no->userData, no->u.oamType);
  422. }
  423. void MySetNotifyProc(OAMSessionID sessionID)
  424. {
  425.     OAMStatus err = noErr;
  426.     OAMNotifyOption notifyNewObj = { kOAMNotifyNewObject, 0 };
  427.     OAMBooleanOption setSelf = { true };
  428.     OAMNotificationSpec spec[3];
  429.     
  430.     err = OAMSetNotificationProc(sessionID, gNotifyProc, NULL);
  431.     
  432.     /* set up NotifySpec */    
  433.     memset(&spec, 0, sizeof(spec));
  434.     /* NOTIFY NEW OBJECT */
  435.     spec[0].oamType = kOAMNotifyStartOption;
  436.     spec[0].bufferDescriptor.buffer = ¬ifyNewObj;
  437.     spec[0].bufferDescriptor.bufferLen = sizeof(OAMNotifyOption);
  438.     
  439.     /* NOTIFICATION (SETSELFSEND == TRUE BY DEFAULT) */
  440.     spec[1].oamType = kOAMNotifySelfOption;
  441.     spec[1].bufferDescriptor.buffer = &setSelf;
  442.     spec[1].bufferDescriptor.bufferLen = sizeof(OAMBooleanOption);
  443.     /* terminator */
  444.     spec[2].oamType = 0;
  445.  
  446.     err = OAMRequestNotification(sessionID, spec, NULL);
  447.     
  448. }
  449.  
  450. int main ( void )
  451. {
  452.     OAMStatus         err = noErr;
  453.     OAMSessionID    sessionID = 0;
  454.     Str31            machineName = {};
  455.     Str31            userName = "\puser";
  456.     Str31            newName = "\pnewName";
  457.     OAMObjectSpec    userObj;
  458.  
  459.     /* initialize Registry library for 4 maximum sessions*/
  460.     err = OAMInitialize(4, 0, NULL, NULL);
  461.     printf("OAMInitialize err: %d\n", err);    
  462.  
  463.     gNotifyProc = NewOAMNotificationProc(MyNotifyProc);
  464.     
  465.     MyListRegistryAgents("\p≈", "\p*"); 
  466.     sessionID = MyOpenLocalAgentSession();
  467.     if (sessionID)
  468.     {
  469.         MySetNotifyProc(sessionID);
  470.     /*
  471.         err = MyGetMachineName(sessionID, machineName);
  472.         printf("MachineName(%#s)\n", machineName);
  473.  
  474.         MyListAllUserNames(sessionID); 
  475.     */    
  476.         ConcatUniqueNumString(userName);
  477.         MyCreateUser(sessionID, userName);
  478.         MyAuthenticateUser(sessionID, userName);
  479.  
  480.         ConcatUniqueNumString(newName);
  481.         BuildObjectSpecByNameType(&userObj, userName, kOAMUser);
  482.         MyChangeUserName(sessionID, &userObj, newName);
  483.  
  484.         err = OAMDeleteObject(sessionID, &userObj, NULL);
  485.  
  486.         OAMCloseSession(sessionID, NULL);
  487.     }
  488.     err = OAMDeInitialize();
  489.  
  490.     return 0;
  491. }